﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using LayerEntity.Producto;
using LayerEntity.Almacen;
using System.Collections;
using LayerLogic;

namespace System2012.Almacen
{
    public partial class frmIngresoInventario : DevExpress.XtraEditors.XtraForm
    {
        ArrayList data = new ArrayList();
        int ID_LISTA_PRECIOS;
        int ID_PRECIO;
        int ID_UNIMED;
        /// <summary>
        /// Indica si estamos editanado o creando uno Nuevo
        /// 0: Nuevo Documento
        /// 1: Editando y Guardando
        /// </summary>
        int operacion = 0;
        public DataTable Series = new DataTable("Series");
        public frmIngresoInventario()
        {
            InitializeComponent();
            SetDataInit();
        }
        public frmIngresoInventario(ArrayList data)
        {
            InitializeComponent();
            RecControles(this);
            SetDataInit();
            CabSeries();
            this.data = data;
        }
        #region Series
        private void CabSeries()
        {
            this.Series.Columns.Add(new DataColumn("Nro_Chasis", typeof(string)));
            this.Series.Columns.Add(new DataColumn("Nro_Motor", typeof(string)));
            this.Series.Columns.Add(new DataColumn("Anio_Modelo", typeof(string)));
            this.Series.Columns.Add(new DataColumn("Anio_Fabrica", typeof(string)));
        }

        #endregion
        #region Methodos
        private void SetDataInit()
        {
            txtAño.Text = DateTime.Now.Year.ToString();
            txtFecha.EditValue = DateTime.Now;
        }
        private void EditarProductos(String codigo)
        {
            EProducto objProd = new EProducto();
            StringBuilder cadena = new StringBuilder();
            cadena.Append(string.Format("where id_producto='{0}'",codigo));
            objProd.Condicion = cadena.ToString ();
            DataTable dtb = System2012.SystemUtils.RecodManajerproducto.GetListaGeneralProductos(objProd);
            this.txtNomProducto.Text = dtb.Rows[0]["descripcion_larga"].ToString();
            this.txtCodigo.Text = dtb.Rows[0]["id_producto"].ToString();
            this.txtNomGrupo.Text = dtb.Rows[0]["grupo"].ToString();
            this.txtIdGurpo.Text = dtb.Rows[0]["idgrupo"].ToString();
            this.txtNomFamilia.Text = dtb.Rows[0]["familia"].ToString();
            this.txtIdFamilia.Text = dtb.Rows[0]["idfamilia"].ToString();
        }
        private void SelectProdudct()
        {
            Listados.frmBusquedaProductos f = new Listados.frmBusquedaProductos();
            f.Opcion = 2;
            f.ShowDialog();
            if (f.data != null)
            {
                if (f.data.Count > 0)
                {
                    if (f.data[0] != null)
                    {
                        EditarProductos(f.data[0].ToString());
                        txtUnimed.Text = f.data[11].ToString();
                        ID_LISTA_PRECIOS=int.Parse(f.data[9].ToString());
                        ID_PRECIO =int.Parse( f.data[10].ToString());
                        ID_UNIMED = int.Parse(f.data[8].ToString());
                    }
                }
            }
        }
         private void CalcToTotal(int op)
        {
            string valData = null;
            double Importe = 0;
            string Cantidad = null;
            Cantidad = txtCantidad.Text;
            if (string.IsNullOrEmpty(Cantidad))
            {
                Cantidad = "0";
                txtCantidad.Text = "0";
            }
            if (op == 1)// si se ingresa el importe se calcula el total
            {
                valData = txtCosto.Text;
                if (string.IsNullOrEmpty(valData))
                {
                    valData = "0";
                    txtCosto.Text = "0";
                }
                Importe = double.Parse(valData)*double.Parse(Cantidad);
                txtTotal.Text = Importe.ToString();
            } 
             if (op == 2)// se si ingresa el total calculamos el precio de acuerdo a la cantidad 
            {
                valData = txtTotal.Text;
                if (string.IsNullOrEmpty(valData))
                {
                    valData = "0";
                    txtTotal.Text = "0";
                }
                if (double.Parse(Cantidad) > 0)
                {
                    Importe = double.Parse(valData) / double.Parse(Cantidad);
                }
                else
                {
                    if (txtCodigo.Text.Length > 0)
                    {
                        XtraMessageBox.Show(this, "NO HA INGRESADO NINGUN VALOR EN CANTIDAD  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtCantidad.Focus();
                        return;
                    }
                }
                txtCosto.Text = Importe.ToString();
            }
        }


        /// <summary>
        /// VALIDA SI EL PRODUCTO SELECCIONADO MANEJA NRO DE SERIRE 
        /// </summary>
        /// <param name="Codigo"></param>
        /// <returns></returns>
         private bool ValidarProductoManegaSeries(string Codigo)
         {
             bool res = true;
             EProducto obj = new EProducto();
             StringBuilder cadena = new StringBuilder();
             cadena.Append("where id_producto='");
             cadena.AppendFormat("{0}'", Codigo);
             cadena.Append("and inc_serie='S'");
             obj.descripcion = cadena.ToString();
             DataTable dtbProd = SystemUtils.RecodManajerproducto.GetListaProductos(obj);
             if (dtbProd.Rows.Count > 0)
             {
                 res = false;
             }

             return res;
         }
         private bool validaCodigoProducto(string codigo)
         {
             bool res = false;
             EProducto obj = new EProducto();
             obj.descripcion = string.Format("where id_producto= '{0}'", codigo);
             DataTable dtbProd = SystemUtils.RecodManajerproducto.GetListaProductos(obj);
             if (dtbProd.Rows.Count > 0)
             {
                 res = true;
             }
             return res;
         }
         private bool ValidateText()
         {
             bool res = true;
             if (txtCodigo.Text == string.Empty)
             {
                 res = false;
                 XtraMessageBox.Show(this, "No ha seleccionado ningun producto  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
             }
             else
             {
                 if (txtCantidad.Text == string.Empty)
                 {
                     res = false;
                     XtraMessageBox.Show(this, "Ingrese la cantidad  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                 }
                 
             }
             return res;
         }
         private bool ValidateImports()
         {
             bool res = true;
             return res;
         }
         /// <summary>
         /// Metodo que permite Importar las series que son ingresadas en el formlario 
         /// de ingresoseriesinventario
         /// </summary>
         /// <param name="copySeries"></param>
         private void AddSeries(DataTable copySeries)
         {
             Series.Clear();
             foreach (DataRow row in copySeries.Rows)
             {
                 if (!string.IsNullOrEmpty(row["Nro_Chasis"].ToString()))
                 {
                     DataRow rSer = Series.NewRow();
                     rSer["Nro_Chasis"] = row["Nro_Chasis"];
                     rSer["Nro_Motor"] = row["Nro_Motor"];
                     rSer["Anio_Modelo"] = row["Anio_Modelo"];
                     rSer["Anio_Fabrica"] = row["Anio_Fabrica"];
                     Series.Rows.Add(rSer);
                 }
             }
         }
         private void NewRegs()
         {
             this.txtCodigo.Text = "";
             txtCantidad.Text = "0";
             txtCosto.Text = "0";
             txtTotal.Text = "0";
             txtIdFamilia.Text = "";
             txtIdGurpo.Text = "";
             txtNomFamilia.Text = "";
             txtNomGrupo.Text = "";
             txtNomProducto.Text = "";
             txtCodigo.Focus();
             
         }
        #endregion

        #region Operaciones ,Grabar,actualizar
        private void Grabar()
        {
                EDetInventory obj = new EDetInventory();
                ESeriesProd Eser = new ESeriesProd();
                obj.Id_almacen=int.Parse(data[0].ToString());
				obj.Cantidad=double.Parse(txtCantidad.Text );
				obj.Costo=double.Parse(txtCosto.Text);
				obj.Total=double.Parse(txtTotal.Text);
				obj.Consolidad=false;
				obj.Id_estado=1;
				obj.Id_precios=ID_PRECIO;
				obj.Id_unidad=ID_UNIMED;
				obj.Id_producto=txtCodigo.Text;
				obj.Id_lista=ID_LISTA_PRECIOS;
				obj.Idusuario="";
				obj.Id_documento=int.Parse(data[1].ToString());
				obj.Serie=data[2].ToString();
				obj.Nro_inventario=data[3].ToString();
				obj.Fecha=DateTime.Parse(data[4].ToString());
                obj.Nro_lote = txtNroLote.Text;
				obj.Item=1;
                Eser.Series = Series;
                string[] result = System2012.SystemUtils.RecordmanagerAlmacen.MantenimientoDetInventarios(obj, Eser,this.operacion == 0 ? EnumOperaciones.Insertar : EnumOperaciones.Actualizar);
               
                switch (result[0])
                {
                    case "0":
                        XtraMessageBox.Show(this, "Registro efectuado con exito", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        NewRegs();
                        break;
                    case "DI-1":
                        XtraMessageBox.Show(this, "Inconsistencia Inesperada al registar el detalle del Inventario\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case "DI-2":
                        XtraMessageBox.Show(this, "Seleccione Correctamente el producto\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case "DI-3":
                        XtraMessageBox.Show(this, "No ha Seleccionado Corectamente el documento del Inventario\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case "S-1":
                        XtraMessageBox.Show(this, "Inconsitencia Inesperada al registrar la Serie\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case "S-2":
                        XtraMessageBox.Show(this, "La Serie del Producto ya Existe\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case "DSI-1":
                        XtraMessageBox.Show(this, "Inconsitencia Inesperada al registar la relacion del inventario con al Serie\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case "DSI-2":
                        XtraMessageBox.Show(this, "Seleccione correctament el documento del Inventario\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case "DSI-3":
                        XtraMessageBox.Show(this, "Vereifique que las series se hayan registrado correctamente\n\n Codigo de error :" + result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    default:
                        XtraMessageBox.Show(this, "Codigo de error :"+result[0], "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                }
            
        }


        #endregion

        #region Desplazamientos
        private void PresionadoTeclas(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Down)
            {
                if (sender == this.txtCodigo)
                {
                    this.txtNroLote.Focus();
                    this.txtNroLote.SelectAll();
                }
                if (sender == this.txtNroLote)
                {
                    this.txtCantidad.Focus();
                    this.txtCantidad.SelectAll();
                }
                if (sender == this.txtCantidad)
                {
                    this.txtCosto.Focus();
                    this.txtCosto.SelectAll();
                }
                if (sender == this.txtCosto)
                {
                    this.txtTotal.Focus();
                    this.txtTotal.SelectAll();
                }
            }

            if (e.KeyCode == Keys.Up)
            {
                if (sender ==txtNroLote)
                {
                    this.txtCodigo.Focus();
                    this.txtCodigo.SelectAll();
                }
                if (sender ==txtCantidad )
                {
                    this.txtNroLote.Focus();
                    this.txtNroLote.SelectAll();
                }
                if (sender ==txtCosto )
                {
                    this.txtCantidad.Focus();
                    this.txtCantidad.SelectAll();
                }
                if (sender ==txtTotal )
                {
                    this.txtCosto.Focus();
                    this.txtCosto.SelectAll();
                }
            }
        }
        public void RecControles(Control control)
        {
            foreach (Control contHijo in control.Controls)
            {
                if (contHijo.HasChildren)
                {
                    this.RecControles(contHijo);
                }
                contHijo.KeyDown += new KeyEventHandler(PresionadoTeclas);
            }
        }
        #endregion
        private void frmIngresoInventario_Load(object sender, EventArgs e)
        {

        }

        private void txtCodigo_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {
                SelectProdudct();
            }
            if (e.KeyCode == Keys.Enter)
            {
                if (validaCodigoProducto(this.txtCodigo.Text)==false)
                {
                    SelectProdudct();
                }
            }
        }

        private void textEdit13_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (double.Parse(txtCantidad.Text) > 0)
                {
                    if (!ValidarProductoManegaSeries(txtCodigo.Text))
                    {
                        ArrayList data = new ArrayList();
                        data.Add(txtNomProducto.Text);
                        data.Add(txtCantidad.Text);
                        fmIngSeriesProducts f = new fmIngSeriesProducts(Series, data);
                        f.ShowDialog();
                        AddSeries(f.Series);
                    }
                }
            }
        }
        
        private void btnGrabar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (ValidateText())
            {
                Grabar();
            }
        }

        private void btnNuevo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            NewRegs();
        }

        private void txtCosto_TextChanged(object sender, EventArgs e)
        {
            CalcToTotal(1);
        }

        private void txtTotal_TextChanged(object sender, EventArgs e)
        {
            CalcToTotal(2);
        }

        private void txtCodigo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (validaCodigoProducto(this.txtCodigo.Text) == false)
                {
                    SelectProdudct();
                }
            }
        }

        private void frmIngresoInventario_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F5 || (e.Control && e.KeyCode == Keys.S) || (e.Control && e.KeyCode== Keys.G))
            {
                if (ValidateText())
                {
                    Grabar();
                }
            }
            if (e.Control && e.KeyCode == Keys.N)
            {
                NewRegs();
            }
        }

        private void btnSalir_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            this.Close();
        }
    }
}